package org.pucc.data.utils

import java.sql.Connection

import com.alibaba.fastjson.JSONObject
import com.google.common.base.CaseFormat
import org.apache.commons.beanutils.BeanUtils

import scala.collection.mutable.ArrayBuffer
import scala.reflect.ClassTag

object JDBCUtil {

  def main(args: Array[String]): Unit = {
//    val connection = MysqlUtil.getConnection
//    val res = queryList[JSONObject](
//      connection = connection,
//      querySql = "select * from user_login_info_1",
//      clz = classOf[JSONObject],
//      toCamel = true
//    )
//    res.foreach(println(_))
//    println(res.size)
//    connection.close()
  }

  /**
   *
   * 统一的JDBC查询方法
   *
   * @param connection JDBC连接
   * @param querySql   查询SQL
   * @param clz        bean对象的class
   * @param toCamel    是否需要把sql的下划线字段转换为驼峰字段
   * @tparam T bean的泛型
   * @return
   */
  def queryList[T](
                    connection: Connection,
                    querySql: String,
                    clz: ClassTag[T] ,
                    toCamel: Boolean = false
                  ): ArrayBuffer[T] = {
    val list = ArrayBuffer[T]()

    // 预编译SQL
    val prep = connection.prepareStatement(querySql)

    //
    val rs = prep.executeQuery()
    val metaData = rs.getMetaData

    // 把读取到的数据输出到Bean（POJO）对象中
    while (rs.next()) {
      val bean = clz.runtimeClass.newInstance().asInstanceOf[T]

      for (i <- 1 to metaData.getColumnCount) {
        // 获取字段值
        val value = rs.getObject(i)

        // 获取字段名字
        var name = metaData.getColumnName(i)

        // 把下划线转化为驼峰，可以对应bean里的field
        name = name.toLowerCase
        if (toCamel) {
          name = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name)
        }

        // 给泛型对象赋值
        // 这里若传入JSON对象，就是赋值给Map，其实函数是根据Bean的Set/Get方法进行操作的
        BeanUtils.setProperty(bean, name, value)
        //        BeanUtils.copyProperty(bean,name,value)

      }
      list += bean
    }
    list
  }
}
